#include "bsp_timer3.h"

timer3_fc_t timer3_fc = {0};
TIM_HandleTypeDef htim3; // 定时器句柄（HAL库核心结构体）

void bsp_timer3_init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    /* clk 配置 */
    __HAL_RCC_TIM3_CLK_ENABLE();

    /* timer 配置 */
    htim3.Instance = TIM3;                             // 选择TIM3
    htim3.Init.Prescaler = 719;                        // 预分频器：72MHz/(719+1)=100kHz（计数频率）
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;       // 向上计数模式
    htim3.Init.Period = 999;                           // 自动重装载值：计数到1000触发更新（100kHz/1000=100Hz → 10ms）
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟不分频

    HAL_TIM_Base_Init(&htim3);

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig); // 时钟源配置（默认内部时钟）

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); // 主模式配置（无需主从触发，默认即可）
    HAL_TIM_Base_Start_IT(&htim3);                                 // 启动定时器
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base)
{
    if (htim_base->Instance == TIM3)
    {
        // 1. 使能TIM3时钟（APB1总线）
        __HAL_RCC_TIM3_CLK_ENABLE();

        // 2. 配置NVIC中断优先级
        HAL_NVIC_SetPriority(TIM3_IRQn, 2, 0); // 抢占优先级2，子优先级0（可根据需求调整）
        HAL_NVIC_EnableIRQ(TIM3_IRQn);         // 使能TIM3中断通道
    }
}

void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim3);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM3) // 确认是TIM3的更新中断
    {

        if (++timer3_fc.cnt_30ms >= 3)
        {
            timer3_fc.cnt_30ms = 0;
            timer3_fc.trigger_30ms_flag = 1;
        }

        if (++timer3_fc.cnt_90ms >= 9)
        {
            timer3_fc.cnt_90ms = 0;
            timer3_fc.trigger_90ms_flag = 1;
        }
    }
}
